﻿
Перем юТест;

////////////////////////////////////////////////////////////////////
// Программный интерфейс

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
	
	юТест = ЮнитТестирование;
	
	ВсеТесты = Новый Массив;
	
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздаетсяБуферДвоичныхДанных");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноЗаписатьБайты");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноПрочитатьБайты");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое16");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое16BigEndian");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое32");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое32BigEndian");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое64");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое64BigEndian");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздаетсяФайловыйПоток");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздаетсяПотокВПамяти");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьВФайл");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСчитываетсяТекстДвоичнымЧтением");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоЧтениеДанныхЧитаетВсеДанныеМетодомПрочитатьСимволы");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоЗаписьДанныхНеЗакрываетПоток");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПриЗаписиВБуферСНевернымИндексомВыбрасываетсяИсключение");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКорректноРаботаютПобитовыеОперацииЗаписиВБуферДвоичныхДанных");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМетодОткрытьПотокДляЧтенияВозвращаетПотокТолькоДляЧтения");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоХешированиеРаботаетСПотоком");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоХешированиеРаботаетСДвоичнымиДанными");

	Возврат ВсеТесты;
	
КонецФункции

Процедура ПослеЗапускаТеста() Экспорт
	
	юТест.УдалитьВременныеФайлы();
	
КонецПроцедуры

Функция ПолучитьБуферСДанными()

	Буфер = Новый БуферДвоичныхДанных(10);
	Для Сч = 0 По 9 Цикл
		Буфер[Сч] = Сч+1;
	КонецЦикла;

	Возврат Буфер;
	
КонецФункции

Процедура ТестДолжен_ПроверитьЧтоСоздаетсяБуферДвоичныхДанных() Экспорт
	
	Б = ПолучитьБуферСДанными();
	юТест.ПроверитьРавенство(10, Б.Размер);
	Для Сч = 0 По Б.Размер-1 Цикл
		юТест.ПроверитьРавенство(Сч+1, Б[Сч], "Проверка значения в индексе " + Сч);
	КонецЦикла;
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноЗаписатьБайты() Экспорт
	
	Б = ПолучитьБуферСДанными();
	Чистый = Новый БуферДвоичныхДанных(Б.Размер);
	
	Чистый.Записать(0, Б);
	юТест.ПроверитьРавенство(Б.Размер, Чистый.Размер);
	Для Сч = 0 По Чистый.Размер-1 Цикл
		юТест.ПроверитьРавенство(Б[Сч], Чистый[Сч], "Сверка в индексе " + Сч);
		юТест.ПроверитьРавенство(Сч+1, Чистый[Сч], "Сверка значения в индексе " + Сч);
	КонецЦикла;
	
	Чистый = Новый БуферДвоичныхДанных(5);
	Чистый.Записать(0, Б, 5);
	Для Сч = 0 По Чистый.Размер-1 Цикл
		юТест.ПроверитьРавенство(Б[Сч], Чистый[Сч], "Сверка частичной записи в индексе " + Сч);
	КонецЦикла;
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноПрочитатьБайты() Экспорт
	
	Б = ПолучитьБуферСДанными();
	Прочитанный = Б.Прочитать(2,2);
	
	юТест.ПроверитьРавенство(2, Прочитанный.Размер);
	юТест.ПроверитьРавенство(3, Прочитанный[0]);
	юТест.ПроверитьРавенство(4, Прочитанный[1]);
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое16() Экспорт
	
	Б = Новый БуферДвоичныхДанных(4);
	Б.ЗаписатьЦелое16(0, 255);
	юТест.ПроверитьРавенство(255, Б.ПрочитатьЦелое16(0));
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое16BigEndian() Экспорт
	
	Б = Новый БуферДвоичныхДанных(4);
	Б.ЗаписатьЦелое16(0, 255);
	юТест.ПроверитьРавенство(65280, Б.ПрочитатьЦелое16(0, ПорядокБайтов.BigEndian));
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое32() Экспорт
	
	юТест.ПодробныеОписанияОшибок(Истина);
	
	Б = Новый БуферДвоичныхДанных(4);
	Б.ЗаписатьЦелое32(0, 4278190080);
	юТест.ПроверитьРавенство(4278190080, Б.ПрочитатьЦелое32(0));
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое32BigEndian() Экспорт
	
	Б = Новый БуферДвоичныхДанных(4);
	Б.ЗаписатьЦелое32(0, 255);
	юТест.ПроверитьРавенство(4278190080, Б.ПрочитатьЦелое32(0, ПорядокБайтов.BigEndian));
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое64() Экспорт
	
	Б = Новый БуферДвоичныхДанных(8);
	Б.ЗаписатьЦелое32(0, 255);
	юТест.ПроверитьРавенство(255, Б.ПрочитатьЦелое32(0));
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМожноЗаписатьПрочитатьЦелое64BigEndian() Экспорт
	
	Б = Новый БуферДвоичныхДанных(8);
	Б.ЗаписатьЦелое64(0, 255);
	юТест.ПроверитьРавенство(18374686479671623680, Б.ПрочитатьЦелое64(0, ПорядокБайтов.BigEndian));
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоСоздаетсяПотокВПамяти() Экспорт

	ПотокСЕмкостью = Новый ПотокВПамяти(100);
	ПростоПоток = Новый ПотокВПамяти;
	Буфер = Новый БуферДвоичныхДанных(10);
	ПотокПоБуферу = Новый ПотокВПамяти(Буфер);
	юТест.ПроверитьРавенство(10, ПотокПоБуферу.Размер());

	ПотокПоБуферу.КопироватьВ(ПотокСЕмкостью);
	юТест.ПроверитьРавенство(10, ПотокСЕмкостью.Размер());
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоСоздаетсяФайловыйПоток() Экспорт
	
	Поток = ФайловыеПотоки.Открыть(ТекущийСценарий().Источник, РежимОткрытияФайла.Открыть);
	Поток.Закрыть();
	
	Поток = Новый ФайловыйПоток(ТекущийСценарий().Источник, РежимОткрытияФайла.Открыть);
	Поток.Закрыть();
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьВФайл() Экспорт
	Буфер = ПолучитьБуферСДанными();
	Файл = юТест.ИмяВременногоФайла();
	Поток = ФайловыеПотоки.Создать(Файл);
	Поток.Записать(Буфер, 0, Буфер.Размер);
	Поток.Закрыть();
	
	ФайлОбъект = Новый Файл(Файл);
	юТест.ПроверитьИстину(ФайлОбъект.Существует());
	юТест.ПроверитьРавенство(10, ФайлОбъект.Размер());
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоСчитываетсяТекстДвоичнымЧтением() Экспорт
	ДД = Новый ДвоичныеДанные(ОбъединитьПути(ТекущийСценарий().Каталог, "templateslib/TemplateData.txt"));
	ЧтениеДанных = Новый ЧтениеДанных(ДД);
	Строка = ЧтениеДанных.ПрочитатьСтроку();
	
	юТест.ПроверитьРавенство("ПРИВЕТ, Я МАКЕТ", Строка);
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоЧтениеДанныхЧитаетВсеДанныеМетодомПрочитатьСимволы() Экспорт

	ДД = Новый ДвоичныеДанные(ОбъединитьПути(ТекущийСценарий().Каталог, "templateslib/TemplateData.txt"));
	ЧтениеДанных = Новый ЧтениеДанных(ДД);
	ЧтениеДанных.Пропустить(3);
	Строка = ЧтениеДанных.ПрочитатьСимволы();

	юТест.ПроверитьРавенство("ПРИВЕТ, Я МАКЕТ", Строка, "Неопределено");
	ЧтениеДанных.Закрыть();

	ЧтениеДанных = Новый ЧтениеДанных(ДД);
	ЧтениеДанных.Пропустить(3);
	Строка = ЧтениеДанных.ПрочитатьСимволы(0);
	юТест.ПроверитьРавенство("ПРИВЕТ, Я МАКЕТ", Строка, "Ноль символов");
	ЧтениеДанных.Закрыть();

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоЗаписьДанныхНеЗакрываетПоток() Экспорт

	Текст = "Какой-то текст";
	Кодировка = "UTF-8";

	ПотокВПамяти = Новый ПотокВПамяти;
	
	Запись = Новый ЗаписьДанных(ПотокВПамяти, Кодировка);
	Запись.ЗаписатьСтроку(Текст, Кодировка);
	Запись.Закрыть();
	
	ПотокВПамяти.Перейти(0, ПозицияВПотоке.Начало);
	
	ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоПриЗаписиВБуферСНевернымИндексомВыбрасываетсяИсключение() Экспорт

	ВторойБуфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03 04");

	Попытка
		Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
		Буфер.ЗаписатьПобитовоеИсключительноеИли(3, ВторойБуфер);
	Исключение
		юТест.ПроверитьВхождение(ОписаниеОшибки(), "Переполнение при работе с буфером");
	КонецПопытки;

	Попытка
		Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
		Буфер.ЗаписатьПобитовоеИсключительноеИли(0, ВторойБуфер);
	Исключение
		юТест.ПроверитьВхождение(ОписаниеОшибки(), "Переполнение при работе с буфером");
	КонецПопытки;

	Попытка
		Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
		Буфер.ЗаписатьПобитовоеИсключительноеИли(1, ВторойБуфер, 3);
	Исключение
		юТест.ПроверитьВхождение(ОписаниеОшибки(), "Переполнение при работе с буфером");
	КонецПопытки;

	Попытка
		Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
		Буфер.ЗаписатьПобитовоеИсключительноеИли(-1, ВторойБуфер, 3);
	Исключение
		юТест.ПроверитьВхождение(ОписаниеОшибки(), "Значение индекса выходит за границы диапазона");
	КонецПопытки;

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоКорректноРаботаютПобитовыеОперацииЗаписиВБуферДвоичныхДанных() Экспорт

	ВторойБуфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03 04");
	
	Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
	Буфер.ЗаписатьПобитовоеИсключительноеИли(0, ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03"));
	юТест.ПроверитьРавенство(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), "000000");

	Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
	Буфер.ЗаписатьПобитовоеИсключительноеИли(0, ВторойБуфер, 3);
	юТест.ПроверитьРавенство(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), "000000");

	Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
	Буфер.ЗаписатьПобитовоеИ(1, ВторойБуфер, 2);
	юТест.ПроверитьРавенство(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), "010002");
	
	Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
	Буфер.ЗаписатьПобитовоеИли(1, ВторойБуфер, 2);
	юТест.ПроверитьРавенство(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), "010303");
	
	Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
	Буфер.ЗаписатьПобитовоеИНе(1, ВторойБуфер, 2);
	юТест.ПроверитьРавенство(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), "010201");
	
	Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("01 02 03");
	Буфер.ЗаписатьПобитовоеИсключительноеИли(1, ВторойБуфер, 2);
	юТест.ПроверитьРавенство(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), "010301");

	Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("00 00 00");
	Буфер.ЗаписатьПобитовоеИли(1, ВторойБуфер, 2);
	юТест.ПроверитьРавенство(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), "000102");

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоМетодОткрытьПотокДляЧтенияВозвращаетПотокТолькоДляЧтения() Экспорт

	Поток = ПолучитьДвоичныеДанныеИзHexСтроки("1b1ec4166a11c03b3afefaea442e7709").ОткрытьПотокДляЧтения();
	юТест.ПроверитьЛожь(Поток.ДоступнаЗапись);
	юТест.ПроверитьИстину(Поток.ДоступноИзменениеПозиции);
	юТест.ПроверитьИстину(Поток.ДоступноЧтение);

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоХешированиеРаботаетСПотоком() Экспорт

	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки("1b1e c416 6a11 c03b 3afe faea 442e 7709");
	Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();

	Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
	Хеширование.Добавить(Поток, 2);
	юТест.ПроверитьРавенство(
		"0b427acd4088d248408e38b34fb378172a05bd71e58b384f5b279beea7aea467",
		НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
	юТест.ПроверитьРавенство(2, Поток.ТекущаяПозиция());

	Хеширование.Добавить(Поток, 12);
	юТест.ПроверитьРавенство(
		"2a0815b87888a03406d7ab482b965361eb96112db88e8ab6ea214cb107ee8469",
		НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
	юТест.ПроверитьРавенство(14, Поток.ТекущаяПозиция());

	Хеширование.Добавить(Поток, 4);
	юТест.ПроверитьРавенство(
		"817eece1eff577a2d28f1478f496e3880f360611d1f264086fd77cf338464654",
		НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
	юТест.ПроверитьРавенство(16, Поток.ТекущаяПозиция());

	Хеширование.Добавить(Поток, 4);
	юТест.ПроверитьРавенство(
		"817eece1eff577a2d28f1478f496e3880f360611d1f264086fd77cf338464654",
		НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
	юТест.ПроверитьРавенство(16, Поток.ТекущаяПозиция());

	Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
	Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
	Поток.Перейти(2, ПозицияВПотоке.Начало);
	Хеширование.Добавить(Поток);
	юТест.ПроверитьРавенство(
		"bda43a0f1c70decfa45d8a2825e6f6facfe0ef11e385794803a165f209b56737",
		НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
	юТест.ПроверитьРавенство(16, Поток.ТекущаяПозиция());

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоХешированиеРаботаетСДвоичнымиДанными() Экспорт

	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки("1b1e c416 6a11 c03b 3afe faea 442e 7709");

	Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
	Хеширование.Добавить(ДвоичныеДанные);
	юТест.ПроверитьРавенство(
		"817eece1eff577a2d28f1478f496e3880f360611d1f264086fd77cf338464654",
		НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));

КонецПроцедуры
